-- SPDX-License-Identifier: GPL-3.0-or-later

local v_motiao = fk.CreateSkill {
  name = "v_motiao",
  tags = {  },
}

v_motiao:addEffect(fk.EventPhaseStart, {
  --赋予摸牌型技能定义
  anim_type = "drawcard",
  --触发条件：
  --触发时机的角色为遍历到的角色；遍历到的角色具有本技能；
  --被遍历到的角色处于回合开始阶段。
  can_trigger = function(self, event, target, player, data)
    return target == player and player:hasSkill(v_motiao.name)
    and player.phase == Player.Start
  end,
  on_cost = function(self, event, target, player, data)
    local room = player.room
    --确认是否发动技能。
    local prompt = "v_motiao_choice_"..player:getMark("v_lianzou_choice")
    if room:askToSkillInvoke(player, {
        skill_name = v_motiao.name,
        prompt
      }) then
      return true
    end
  end,
  on_use = function(self, event, target, player, data)
    local room = player.room
    --以on_cost中做出选择为代价，本回合内你只能造成1点伤害，你使用牌指定自己为目标之一后，摸一张牌。
      room:setPlayerMark(player, "v_motiao_using-turn", 1)
      room:setPlayerMark(player, "@@v_motiao_using-turn", 1)
      if player:getMark("@v_lianzou_status") ~= "v_noinvalid" and
       player:getMark("@v_lianzou_status") ~= "v_fullypower" then
        room:setPlayerMark(player, "@@v_motiao_invalidity-turn", 1)
      end
  end,
})

v_motiao:addEffect(fk.TargetSpecified, {
  anim_type = "drawcard",
  --触发条件：
  --触发时机的角色为遍历到的角色；遍历到的角色具有本技能
  --存在回合开始阶段时使用此技能的标签
  --被指定的角色中存在遍历到的角色。
  --本次流程中第一次触发这个时机
  can_trigger = function(self, event, target, player, data)
    --遍历所有被指定到的角色，确认是否存在遍历到的角色
    local motiao_useornot = false
    local motiao_tar = data:getAllTargets()
    for _, p in ipairs(motiao_tar) do
      if p == player then
        motiao_useornot = true
      end
    end
    return target == player and player:hasSkill(v_motiao.name)
    and player:getMark("v_motiao_using-turn") > 0
    and motiao_useornot
    and data.firstTarget
  end,
  on_cost = function(self, event, target, player, data)
    --满足技能发动要求后，锁定发动。
    if player:getMark("v_motiao_using-turn") > 0 then
      return true
    end
  end,
  on_use = function(self, event, target, player, data)
    --以on_cost中做出选择为代价，本回合内你只能造成1点伤害，你使用牌指定自己为目标之一后，摸一张牌。
    player:drawCards(1, v_motiao.name)
  end,
})

local spec = {
  can_refresh = function(self, event, target, player, data)
    if not (target == player and player:hasSkill(v_motiao.name)) then
      return false
    end
    return player:getMark("v_motiao_using-turn") > 0
      and data.damage > 0
      and player:getMark("@v_lianzou_status") ~= "v_nodamage" and 
      player:getMark("@v_lianzou_status") ~= "v_fullypower"
  end,
}

v_motiao:addEffect(fk.DamageCaused, {
  -- 刷新时机：
  -- 触发时机的角色为遍历到的角色；遍历到的角色具有本技能；
  -- 存在回合开始阶段时使用此技能的标签；
  -- 造成的伤害大于0；
  -- 非光属性伤害（暂未实装）。
  can_refresh = spec.can_refresh,
  on_refresh = function(self, event, target, player, data)
    local room = player.room
    if player:getMark("@@v_motiao_after-turn") > 0 then
      room:sendLog{
        type = "#defense_damage",
        from = player.id,
        --log.to是数组
        to = {data.to.id},
        arg = v_motiao.name,
        arg2 = data.damage,
      }
      data.damage = 0
    end
  end
})

v_motiao:addEffect(fk.Damage, {
  -- 刷新时机：
  -- 触发时机的角色为遍历到的角色；遍历到的角色具有本技能；
  -- 存在回合开始阶段时使用此技能的标签；
  -- 造成的伤害大于0；
  -- 非光属性伤害（暂未实装）。
  can_refresh = spec.can_refresh,
  on_refresh = function(self, event, target, player, data)
    local room = player.room
    room:setPlayerMark(player, "@@v_motiao_using-turn", 0)
    room:setPlayerMark(player, "@@v_motiao_after-turn", 1)
  end
})

v_motiao:addEffect("invalidity", {
  name = "#v_motiao_invalidity",
  invalidity_func = function(self, from, skill)
    if from:getMark("@@v_motiao_invalidity-turn") > 0 then
      return skill:isEquipmentSkill()
    end
  end
})

return v_motiao